#include <bits/stdc++.h>
using namespace std;

/*
75. 颜色分类
已解答
中等
相关标签
相关企业
提示
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ，原地 对它们进行排序，使得相同颜色的元素相邻，并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

 

示例 1：

输入：nums = [2,0,2,1,1,0]
输出：[0,0,1,1,2,2]
示例 2：

输入：nums = [2,0,1]
输出：[0,1,2]
 

提示：

n == nums.length
1 <= n <= 300
nums[i] 为 0、1 或 2
 

进阶：

你能想出一个仅使用常数空间的一趟扫描算法吗？
*/

class Solution {
public:
    void sortColors(vector<int>& nums) {
        // 荷兰旗
        int low = 0;
        int mid = 0;
        int high = nums.size() - 1;
        while (mid <= high) {
            if (nums[mid] == 0) {
                swap(nums[low], nums[mid]);
                low++;
                mid++;
            } else if (nums[mid] == 1)
                mid++;
            else {
                swap(nums[mid], nums[high]);
                high--;
            }
        }
    }
};

// 进阶
// 三指针可以解决
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int left = 0, right = nums.size() - 1, curr = 0;
        while (curr <= right) {
            if (nums[curr] == 0) {
                swap(nums[curr++], nums[left++]);
            } else if (nums[curr] == 1) {
                curr++;
            } else {
                swap(nums[curr], nums[right--]);
            }
        }
    }
};